package cn.acac.yygh.handle;

import cn.acac.yygh.exception.MyException;
import cn.acac.yygh.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@ControllerAdvice   // 凡是由ControllerAdvice标记的类都表示全局异常处理类
// @RestControllerAdvice  此注解为ControllerAdvice和ResponseBody注解的合体
@Slf4j  // 添加日志输入
public class GlobalException {

    /**
     * 最高级别异常
     * 此异常处理缺点为：粒度过大
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public R handleException(Exception ex){
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message("后台出现错误，错误信息为:" + ex.getMessage());
    }

    /**
     * 编写粒度更小的异常
     * 算数异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = ArithmeticException.class)
    @ResponseBody
    public R handleArithmeticException(ArithmeticException ex){
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message("算数异常，请联系后端人员进行处理，异常信息为：" + ex.getMessage());
    }

    /**
     * 编写粒度更小的异常
     * 空指针异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public R handleNullPointerException(NullPointerException ex){
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message("空指针异常，请联系后端人员进行处理，异常信息为：" + ex.getMessage());
    }

    /**
     * 编写粒度更小的异常
     * 查找指定类不存在异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = ClassNotFoundException.class)
    @ResponseBody
    public R handleClassNotFoundException(ClassNotFoundException ex){
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message("查找指定类不存在异常，请联系后端人员进行处理，异常信息为：" + ex.getMessage());
    }

    /**
     * 编写粒度更小的异常
     * 数组角标越界异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = IndexOutOfBoundsException.class)
    @ResponseBody
    public R handleIndexOutOfBoundsException(IndexOutOfBoundsException ex){
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message("数组角标越界异常异常，请联系后端人员进行处理，异常信息为：" + ex.getMessage());
    }

    /**
     * 编写粒度更小的异常
     * 自定义异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = MyException.class)
    @ResponseBody
    public R handleMyException(MyException ex){
        // 将异常信息输出到日志文件中
        log.error(ex.getMessage());
        // 输出异常信息
        ex.printStackTrace();
        // 返回异常信息给前端
        return R.error().message(ex.getMessage()).code(ex.getCode());
    }

}
